package cn.com.bluemoon.daps.model.service;


import cn.com.bluemoon.daps.common.domain.ResultBean;
import cn.com.bluemoon.daps.common.enums.DatabaseType;
import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.model.dto.ModelInfoDto;
import cn.com.bluemoon.daps.model.dto.score.TableScoreDto;
import cn.com.bluemoon.daps.model.entity.*;
import cn.com.bluemoon.daps.model.vo.DataModelInsertVo;
import cn.com.bluemoon.daps.model.vo.DataModelPageVo;
import cn.com.bluemoon.daps.model.vo.score.SearchTableScoreVo;
import cn.com.bluemoon.daps.system.entity.DapSystemInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuple4;

import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 数据模型-模型表 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-03
 */
public interface DapDataModelService extends IBmService<DapDataModel> {

    /**
     * 查询接口
     * @param dataModePageVo
     * @return
     */
    IPage<ModelInfoDto> getModelList(DataModelPageVo dataModePageVo);

    /**
     * 新增接口
     * @param vo
     * @return
     */
    Boolean insertModel(DataModelInsertVo vo);

    /**
     * 根据系统id获得集合
     * @param sysId
     * @return
     */
    List<DapDataModel> getModelListById(String sysId);

    /**
     * 通过id获得模型
     * @param modelId
     * @return
     */
    DapDataModel getModelById(String modelId);

    /**
     * 删除模型
     * @param modelId
     * @return
     */
    ResultBean<Boolean> deleteModel(String modelId);


    ResultBean<Boolean> modifyModel(DataModelInsertVo vo);


    /**
     * 根据模型id获取系统下的模型（排己）
     * 1.找到模型中的系统id
     * 2.验证系统id有效性
     * 3.根据系统id获取模型列表，排除自己
     *
     * @param modelId 模型id
     * @return 获取模型对应的系统下的公共排自的模型数据
     */
    public List<DapDataModel> findCommonModelsByModelId(String modelId);

    /**
     * 获取模型id对应的系统信息
     *
     * @param modelId 模型id
     * @return 获取模型id对应的系统信息
     */
    public abstract Optional<DapSystemInfo> findSystemInfoByModelId(String modelId);

    /**
     * 根据模型id判断是否为数仓系统
     *
     * @param modelId 模型id
     * @return true为是 false否
     */
    Tuple2<Boolean, DapSystemInfo> isDwSystemByModelId(String modelId);

    /**
     * 根据模型id获取对应的数据库类型
     *
     * @param modelId 模型id
     * @return 数据库类型
     */
    Tuple2<DapDataModel, Optional<DatabaseType>> findModelAndDbTypeByModelId(String modelId);

    /**
     * 分别获取模型下的表、字段、索引、分区的列表信息
     *
     * @param modelId 模型id
     * @param newest 是否为最新数据
     * @return 结果集
     */
    Tuple4<List<DapDataModelTable>, List<DapDataModelTableField>, List<DapDataModelSubordinateKey>, List<DapDataModelTablePartition>> queryModelInfosByModelAndNewest(String modelId, boolean newest);

    /**
     * 模糊获取模型列表
     * @param name 为空返回全部模型
     * @return list
     */
    List<DapDataModel> matchName(String name);

    /**
     * 评分详情列表
     * @param vo
     * @return
     */
    IPage<TableScoreDto> getTableScoreList(SearchTableScoreVo vo);
}
